home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / HACKPASS.ZIP / HACKPASS.SHR
Text File  |  1991-07-16  |  36KB  |  1,600 lines

  1. #! /bin/sh
  2. # This is a shell archive.  Remove anything before this line, then unpack
  3. # it by saving it into a file and typing "sh file".  To overwrite existing
  4. # files, type "sh file -c".  You can also feed this as standard input via
  5. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  6. # will see the following message at the end:
  7. #        "End of archive 1 (of 1)."
  8. # Contents:  CRACK CRACK/Crack CRACK/DICTS CRACK/Makefile CRACK/PROGS
  9. #   CRACK/PROGS/-i CRACK/PROGS/Makefile CRACK/PROGS/crack-lib.c
  10. #   CRACK/PROGS/crack-pp.c CRACK/PROGS/crack-pwc.c CRACK/PROGS/crack.h
  11. #   CRACK/PROGS/sh.makedict CRACK/README CRACK/bad_pws.dat
  12. # Wrapped by aem@aberda on Mon Jul 15 19:08:05 1991
  13. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  14. if test ! -d 'CRACK' ; then
  15.     echo shar: Creating directory \"'CRACK'\"
  16.     mkdir 'CRACK'
  17. fi
  18. if test -f 'CRACK/Crack' -a "${1}" != "-c" ; then
  19.   echo shar: Will not clobber existing file \"'CRACK/Crack'\"
  20. else
  21. echo shar: Extracting \"'CRACK/Crack'\" \(492 characters\)
  22. sed "s/^X//" >'CRACK/Crack' <<'END_OF_FILE'
  23. X#!/bin/csh
  24. X
  25. Xset op=hack-me.$$
  26. Xset tmp=/tmp/pwf$$
  27. Xset bin=PROGS
  28. Xset dicts=DICTS
  29. X
  30. Xif ( "$1" == "" ) then
  31. X    echo "Usage:    $0 passwdfile [passwdfile...]"
  32. X    exit 1
  33. Xendif
  34. X
  35. Xecho "Crack 2.7a Password Cracker by ADE Muffett, 1991"
  36. X
  37. Xmake
  38. X
  39. Xcp /dev/null $tmp    # "touch $tmp", "> $tmp", whatever...
  40. X
  41. Xforeach file ($*)
  42. X    awk '/^[A-Za-z0-9]/{print "'$file'" ":" $0}' < $file >> $tmp
  43. Xend
  44. X
  45. Xecho "Backgrounding job. Output will be in $op"
  46. X
  47. Xsort -t: +2 $tmp | $bin/crack-pwc $dicts/dict.* >& $op &
  48. X
  49. Xsleep 5
  50. X
  51. Xrm $tmp
  52. END_OF_FILE
  53. if test 492 -ne `wc -c <'CRACK/Crack'`; then
  54.     echo shar: \"'CRACK/Crack'\" unpacked with wrong size!
  55. fi
  56. chmod +x 'CRACK/Crack'
  57. # end of 'CRACK/Crack'
  58. fi
  59. if test ! -d 'CRACK/DICTS' ; then
  60.     echo shar: Creating directory \"'CRACK/DICTS'\"
  61.     mkdir 'CRACK/DICTS'
  62. fi
  63. if test -f 'CRACK/Makefile' -a "${1}" != "-c" ; then
  64.   echo shar: Will not clobber existing file \"'CRACK/Makefile'\"
  65. else
  66. echo shar: Extracting \"'CRACK/Makefile'\" \(725 characters\)
  67. sed "s/^X//" >'CRACK/Makefile' <<'END_OF_FILE'
  68. X###
  69. X# add other dictionaries here, relative to "."
  70. X###
  71. XDICTSRC=    /usr/dict/words bad_pws.dat
  72. X
  73. X###
  74. X# Not-so configurable bitz...
  75. X###
  76. XBINDIR=        PROGS
  77. XDICTDIR=    DICTS
  78. XPPDRIVER=    $(BINDIR)/sh.makedict
  79. XDICTSTAMP=    $(DICTDIR)/dict-stamp
  80. X
  81. Xall:        # I love recursion...
  82. X        ( cd $(BINDIR) ; make )
  83. X        ( make $(DICTSTAMP) )
  84. X
  85. X$(DICTSTAMP):    $(PP) $(DICTSRC)
  86. X        $(PPDRIVER) $(DICTDIR) $(DICTSRC)
  87. X        touch $(DICTSTAMP)
  88. X
  89. Xtests:
  90. X        ( cd $(BINDIR) ; make tests )
  91. X
  92. Xalotfaster:
  93. X        ( cd $(BINDIR) ; make alotfaster )
  94. X
  95. Xclean:
  96. X        -( cd $(DICTDIR) && rm * )
  97. X        -rm die hack-me.* dict.?
  98. X
  99. Xspotless:
  100. X        ( cd $(BINDIR) && make clean )
  101. X        ( make clean )
  102. X
  103. Xprint:
  104. X        lpr -p     Makefile \
  105. X            Crack \
  106. X            README \
  107. X            PROGS/Makefile \
  108. X            PROGS/*.h \
  109. X            PROGS/*.c \
  110. X            PROGS/sh.*
  111. END_OF_FILE
  112. if test 725 -ne `wc -c <'CRACK/Makefile'`; then
  113.     echo shar: \"'CRACK/Makefile'\" unpacked with wrong size!
  114. fi
  115. # end of 'CRACK/Makefile'
  116. fi
  117. if test ! -d 'CRACK/PROGS' ; then
  118.     echo shar: Creating directory \"'CRACK/PROGS'\"
  119.     mkdir 'CRACK/PROGS'
  120. fi
  121. if test -f 'CRACK/PROGS/-i' -a "${1}" != "-c" ; then
  122.   echo shar: Will not clobber existing file \"'CRACK/PROGS/-i'\"
  123. else
  124. echo shar: Extracting \"'CRACK/PROGS/-i'\" \(0 characters\)
  125. sed "s/^X//" >'CRACK/PROGS/-i' <<'END_OF_FILE'
  126. END_OF_FILE
  127. if test 0 -ne `wc -c <'CRACK/PROGS/-i'`; then
  128.     echo shar: \"'CRACK/PROGS/-i'\" unpacked with wrong size!
  129. fi
  130. # end of 'CRACK/PROGS/-i'
  131. fi
  132. if test -f 'CRACK/PROGS/Makefile' -a "${1}" != "-c" ; then
  133.   echo shar: Will not clobber existing file \"'CRACK/PROGS/Makefile'\"
  134. else
  135. echo shar: Extracting \"'CRACK/PROGS/Makefile'\" \(513 characters\)
  136. sed "s/^X//" >'CRACK/PROGS/Makefile' <<'END_OF_FILE'
  137. X###
  138. X# Configurtable bitz...
  139. X###
  140. XCFLAGS=        -O2 # -Bstatic # (Static linking for SunOS fix)
  141. X
  142. X###
  143. X# Not-so configurable bitz...
  144. X###
  145. XPWC=        crack-pwc
  146. XPP=        crack-pp
  147. X
  148. X###
  149. X# Positively hard to configure bitz...
  150. X###
  151. XCRACKMOD=    crack-lib.o
  152. X
  153. Xall:        $(PP) $(PWC)
  154. X
  155. X$(PP):    $(PP).o $(CRACKMOD)
  156. X        $(CC) $(CFLAGS) -o $@ crack-pp.o $(CRACKMOD)
  157. X
  158. X$(PWC):    $(PWC).o $(CRACKMOD)
  159. X        $(CC) $(CFLAGS) -o $@ crack-pwc.o $(CRACKMOD)
  160. X
  161. Xalotfaster:
  162. X        $(CC) -O4 -o $(PWC) \
  163. X            crack-pwc.c crack-lib.c
  164. X
  165. Xclean:
  166. X        -rm $(PP) $(PWC) *.o *.u $(DICTSTAMP)
  167. END_OF_FILE
  168. if test 513 -ne `wc -c <'CRACK/PROGS/Makefile'`; then
  169.     echo shar: \"'CRACK/PROGS/Makefile'\" unpacked with wrong size!
  170. fi
  171. # end of 'CRACK/PROGS/Makefile'
  172. fi
  173. if test -f 'CRACK/PROGS/crack-lib.c' -a "${1}" != "-c" ; then
  174.   echo shar: Will not clobber existing file \"'CRACK/PROGS/crack-lib.c'\"
  175. else
  176. echo shar: Extracting \"'CRACK/PROGS/crack-lib.c'\" \(1764 characters\)
  177. sed "s/^X//" >'CRACK/PROGS/crack-lib.c' <<'END_OF_FILE'
  178. X#include "crack.h"
  179. X
  180. X/*
  181. X * This program is copyright (c) Alec Muffett 1991 except for certain
  182. X * portions of code ("fdes-crypt.c") copyright (c) Robert Baldwin, Icarus
  183. X * Sparry and Alec Muffett.  The author(s) disclaims all responsibility or
  184. X * liability with respect to it's usage or its effect upon hardware or
  185. X * computer systems.  This software is in the public domain and is freely
  186. X * redisrtibutable PROVIDED that this copyright notice remains intact.
  187. X */
  188. X
  189. Xvoid
  190. XTrim (string)            /* remove trailing whitespace from a string */
  191. X    register char *string;
  192. X{
  193. X    register char *ptr;
  194. X
  195. X    for (ptr = string; *ptr; ptr++);
  196. X    while ((--ptr >= string) && isspace (*ptr));
  197. X    *(++ptr) = '\0';
  198. X}
  199. X
  200. Xchar *
  201. XReverse (str)            /* return a pointer to a reversal */
  202. X    register char *str;
  203. X{
  204. X    register int i;
  205. X    register int j;
  206. X    register char *ptr;
  207. X    static char area[STRINGSIZE];
  208. X
  209. X    j = i = strlen (str);
  210. X    while (*str)
  211. X    {
  212. X    area[--i] = *str++;
  213. X    }
  214. X    area[j] = '\0';
  215. X    return (area);
  216. X}
  217. X
  218. Xchar *
  219. XUppercase (str)            /* return a pointer to an uppercase */
  220. X    register char *str;
  221. X{
  222. X    register char *ptr;
  223. X    static char area[STRINGSIZE];
  224. X
  225. X    ptr = area;
  226. X    while (*str)
  227. X    {
  228. X    *(ptr++) = islower (*str) ? toupper (*str) : *str;
  229. X    str++;
  230. X    }
  231. X    *ptr = '\0';
  232. X
  233. X    return (area);
  234. X}
  235. X
  236. Xchar *
  237. XLowercase (str)            /* return a pointer to an lowercase */
  238. X    register char *str;
  239. X{
  240. X    register char *ptr;
  241. X    static char area[STRINGSIZE];
  242. X
  243. X    ptr = area;
  244. X    while (*str)
  245. X    {
  246. X    *(ptr++) = isupper (*str) ? tolower (*str) : *str;
  247. X    str++;
  248. X    }
  249. X    *ptr = '\0';
  250. X
  251. X    return (area);
  252. X}
  253. X
  254. Xchar *
  255. XClone (string)
  256. X    char *string;
  257. X{
  258. X    int len;
  259. X    char *retval;
  260. X
  261. X    retval = (char *) malloc (strlen (string) + 1);
  262. X    strcpy (retval, string);
  263. X    return (retval);
  264. X}
  265. END_OF_FILE
  266. if test 1764 -ne `wc -c <'CRACK/PROGS/crack-lib.c'`; then
  267.     echo shar: \"'CRACK/PROGS/crack-lib.c'\" unpacked with wrong size!
  268. fi
  269. # end of 'CRACK/PROGS/crack-lib.c'
  270. fi
  271. if test -f 'CRACK/PROGS/crack-pp.c' -a "${1}" != "-c" ; then
  272.   echo shar: Will not clobber existing file \"'CRACK/PROGS/crack-pp.c'\"
  273. else
  274. echo shar: Extracting \"'CRACK/PROGS/crack-pp.c'\" \(3019 characters\)
  275. sed "s/^X//" >'CRACK/PROGS/crack-pp.c' <<'END_OF_FILE'
  276. X#include "crack.h"
  277. X
  278. X/*
  279. X * This program is copyright (c) Alec Muffett 1991 except for certain
  280. X * portions of code ("fdes-crypt.c") copyright (c) Robert Baldwin, Icarus
  281. X * Sparry and Alec Muffett.  The author(s) disclaims all responsibility or
  282. X * liability with respect to it's usage or its effect upon hardware or
  283. X * computer systems.  This software is in the public domain and is freely
  284. X * redisrtibutable PROVIDED that this copyright notice remains intact.
  285. X */
  286. X
  287. X/* These used to be enums. Oh well... non-portability rules OK */
  288. X#define ORDER_LCF    0
  289. X#define ORDER_LCFP    1
  290. X#define ORDER_MCF    2
  291. X#define ORDER_UCF    3
  292. X#define ORDER_LCB    4
  293. X#define ORDER_UCB    5
  294. X#define ORDER_MCB    6
  295. X#define NUMFILES    7
  296. X
  297. Xint
  298. Xmain (argc, argv)
  299. X    int argc;
  300. X    char *argv[];
  301. X{
  302. X    register int i;
  303. X    register char *ptr;
  304. X    int all_digits;
  305. X    int all_letters_upper;
  306. X    int all_letters_lower;
  307. X    char buffer[STRINGSIZE];
  308. X
  309. X    FILE *fp;
  310. X    FILE *fps[NUMFILES];
  311. X
  312. X    if (argc == 1)
  313. X    {
  314. X    printf ("Usage:\t%s dictsrc [dictsrc ...]\n", argv[0]);
  315. X    exit (1);
  316. X    }
  317. X
  318. X    for (i = 0; i < NUMFILES; i++)
  319. X    {
  320. X        char scratch[255];
  321. X
  322. X        sprintf(scratch, "dict.%c", i + 'a');
  323. X    if (!(fps[i] = fopen (scratch, "w")))
  324. X    {
  325. X        perror (scratch);
  326. X        exit (3);
  327. X    }
  328. X    }
  329. X
  330. X    for (i = 1; argv[i]; i++)
  331. X    {
  332. X    if (!(fp = fopen (argv[i], "r")))
  333. X    {
  334. X        perror (argv[i]);
  335. X        exit (1);
  336. X    }
  337. X
  338. X    printf ("dictpp: sourcing from file '%s'\n", argv[i]);
  339. X
  340. X    while (fgets (buffer, STRINGSIZE, fp))
  341. X    {
  342. X        Trim (buffer);
  343. X        if (!*buffer || !buffer[1])    /* skip single letters */
  344. X        {
  345. X        continue;
  346. X        }
  347. X
  348. X#ifndef SHORT_PASSWDS
  349. X        if (strlen (buffer) < 5)
  350. X        {
  351. X        continue;
  352. X        }
  353. X#endif
  354. X        all_letters_upper = 1;
  355. X        all_letters_lower = 1;
  356. X        all_digits = 1;
  357. X
  358. X        for (ptr = buffer; *ptr; ptr++)
  359. X        {
  360. X            if (!isdigit(*ptr))
  361. X            {
  362. X                all_digits = 0;
  363. X            }
  364. X
  365. X        if (isupper (*ptr))
  366. X        {
  367. X            all_letters_lower = 0;
  368. X        } else if (islower (*ptr))
  369. X        {
  370. X            all_letters_upper = 0;
  371. X        }
  372. X        }
  373. X
  374. X        if (all_digits)
  375. X        {
  376. X        fprintf (fps[ORDER_LCF], "%.8s\n", buffer);
  377. X        continue;    /* hehehehehe */
  378. X        }
  379. X
  380. X        if (!all_letters_upper)
  381. X        {
  382. X        fprintf (fps[ORDER_UCF], "%.8s\n", Uppercase (buffer));
  383. X        fprintf (fps[ORDER_UCB], "%.8s\n", Uppercase (Reverse (buffer)));
  384. X        } else
  385. X        {
  386. X        fprintf (fps[ORDER_UCF], "%.8s\n", buffer);
  387. X        fprintf (fps[ORDER_UCB], "%.8s\n", Reverse (buffer));
  388. X        }
  389. X
  390. X        if (!all_letters_lower)
  391. X        {
  392. X        fprintf (fps[ORDER_LCF], "%.8s\n", Lowercase (buffer));
  393. X        fprintf (fps[ORDER_LCB], "%.8s\n", Lowercase (Reverse (buffer)));
  394. X        } else
  395. X        {
  396. X        fprintf (fps[ORDER_LCF], "%.8s\n", buffer);
  397. X        fprintf (fps[ORDER_LCB], "%.8s\n", Reverse (buffer));
  398. X        if (buffer[strlen(buffer) - 1] != 's')
  399. X        {
  400. X            fprintf (fps[ORDER_LCFP], "%.8ss\n", buffer);
  401. X        }
  402. X        }
  403. X
  404. X        if (!all_letters_lower && !all_letters_upper)
  405. X        {
  406. X        fprintf (fps[ORDER_MCF], "%.8s\n", buffer);
  407. X        fprintf (fps[ORDER_MCB], "%.8s\n", Reverse (buffer));
  408. X        }
  409. X    }
  410. X    fclose (fp);
  411. X    }
  412. X
  413. X    for (i = 0; i < NUMFILES; i++)
  414. X    {
  415. X    fclose (fps[i]);
  416. X    }
  417. X}
  418. END_OF_FILE
  419. if test 3019 -ne `wc -c <'CRACK/PROGS/crack-pp.c'`; then
  420.     echo shar: \"'CRACK/PROGS/crack-pp.c'\" unpacked with wrong size!
  421. fi
  422. # end of 'CRACK/PROGS/crack-pp.c'
  423. fi
  424. if test -f 'CRACK/PROGS/crack-pwc.c' -a "${1}" != "-c" ; then
  425.   echo shar: Will not clobber existing file \"'CRACK/PROGS/crack-pwc.c'\"
  426. else
  427. echo shar: Extracting \"'CRACK/PROGS/crack-pwc.c'\" \(9199 characters\)
  428. sed "s/^X//" >'CRACK/PROGS/crack-pwc.c' <<'END_OF_FILE'
  429. X#include "crack.h"
  430. X#undef VERBOSE
  431. X#undef LISTING
  432. X
  433. X/* LOOK FOR CONFIGURATION OPTIONS IN "crack.h" */
  434. X
  435. X/*
  436. X * This program is copyright (c) Alec Muffett 1991 except for certain
  437. X * portions of code ("fdes-crypt.c") copyright (c) Robert Baldwin, Icarus
  438. X * Sparry and Alec Muffett.  The author(s) disclaims all responsibility or
  439. X * liability with respect to it's usage or its effect upon hardware or
  440. X * computer systems.  This software is in the public domain and is freely
  441. X * redisrtibutable PROVIDED that this copyright notice remains intact.
  442. X */
  443. X
  444. X/*
  445. X * crack-pwc.c - an optimised password cracker. (c) ADE Muffett, Dec 1990.
  446. X * Totally rewritten from an 'standard' password cracker that had been
  447. X * floating about on ther network. Apart from the entire re-write, to save my
  448. X * sanity, this thing orders passwords to minimise calls to crypt(). Use
  449. X * fcrypt() where you have it.
  450. X */
  451. X
  452. Xstruct ENTRY
  453. X{
  454. X    int done;
  455. X    char *filename;
  456. X    struct passwd passwd;
  457. X    struct ENTRY *across;
  458. X    struct ENTRY *next;
  459. X};
  460. X
  461. Xstatic struct ENTRY *root;
  462. X
  463. X/*
  464. X * DIDDY LITTLE USEFUL FUNCTIONS
  465. X */
  466. X
  467. Xvoid
  468. XLog (fmt, a, b, c, d, e, f, g, h, i, j)
  469. X    char *fmt;
  470. X{
  471. X    long t;
  472. X
  473. X    time (&t);
  474. X    printf ("pwc: %-15.15s ", ctime (&t) + 4);
  475. X    printf (fmt, a, b, c, d, e, f, g, h, i, j);
  476. X    fflush (stdout);
  477. X}
  478. X/*
  479. X * STRUCTURE SPECIFIC FUNCTIONS
  480. X */
  481. X
  482. Xchar *
  483. XPWSkip (p)            /* jump the ':' in a pwent */
  484. X    register char *p;
  485. X{
  486. X    while (*p && *p != ':')
  487. X    {
  488. X    p++;
  489. X    }
  490. X    if (*p)
  491. X    {
  492. X    *p++ = '\0';
  493. X    }
  494. X    return (p);
  495. X}
  496. X
  497. Xstruct ENTRY *
  498. XParse (buffer)            /* break up input into a structure */
  499. X    register char *buffer;
  500. X{
  501. X    register char *p;
  502. X    register struct ENTRY *retval;
  503. X
  504. X    retval = (struct ENTRY *) malloc (sizeof (struct ENTRY));
  505. X    retval -> next = retval -> across = NULL;
  506. X    retval -> done = 0;
  507. X    Trim (buffer);
  508. X
  509. X    p = Clone (buffer);
  510. X    retval -> filename = p;
  511. X    p = PWSkip (p);
  512. X    retval -> passwd.pw_name = p;
  513. X    p = PWSkip (p);
  514. X    retval -> passwd.pw_passwd = p;
  515. X    p = PWSkip (p);
  516. X    retval -> passwd.pw_uid = 1;
  517. X    p = PWSkip (p);
  518. X    retval -> passwd.pw_gid = 1;
  519. X    p = PWSkip (p);
  520. X    retval -> passwd.pw_gecos = p;
  521. X    p = PWSkip (p);
  522. X    retval -> passwd.pw_dir = p;
  523. X    p = PWSkip (p);
  524. X    retval -> passwd.pw_shell = p;
  525. X    return (retval);
  526. X}
  527. X/*
  528. X * START OF MODULES
  529. X */
  530. X
  531. Xvoid
  532. XLoadData ()            /* load sorted entries into memory */
  533. X{
  534. X    char *ptr;
  535. X    char salt[2];
  536. X    char buffer[STRINGSIZE];
  537. X    int numlines;
  538. X    int numentries;
  539. X    register struct ENTRY *new_element;
  540. X    register struct ENTRY *current_line;
  541. X
  542. X    numlines = 0;
  543. X    numentries = 0;
  544. X    current_line = NULL;
  545. X
  546. X    while (fgets (buffer, STRINGSIZE, stdin))
  547. X    {
  548. X    if (!*buffer || isspace (*buffer))
  549. X    {
  550. X        continue;
  551. X    }
  552. X    new_element = Parse (buffer);
  553. X
  554. X    ptr = new_element -> passwd.pw_passwd;
  555. X    if (!ptr[0] || ptr[0] == '*')
  556. X    {
  557. X        continue;
  558. X    }
  559. X    numentries++;
  560. X
  561. X    if (ptr[0] == salt[0] && ptr[1] == salt[1])
  562. X    {
  563. X        new_element -> across = current_line;
  564. X        current_line = new_element;
  565. X
  566. X    } else
  567. X    {
  568. X        if (current_line)
  569. X        {
  570. X        current_line -> next = root;
  571. X        }
  572. X        root = current_line;
  573. X        current_line = new_element;
  574. X        numlines++;
  575. X        salt[0] = ptr[0];
  576. X        salt[1] = ptr[1];
  577. X    }
  578. X    }
  579. X
  580. X    if (current_line)        /* last one tends to hang about */
  581. X    {
  582. X    current_line -> next = root;
  583. X    root = current_line;
  584. X    numlines++;
  585. X    }
  586. X    Log ("Loaded %d password entries into %d salted lines.\n",
  587. X     numentries, --numlines);
  588. X
  589. X    return;
  590. X}
  591. X/*
  592. X * PASSWORD CRACKING LOW LEVEL FUNCTIONS
  593. X */
  594. X
  595. Xint
  596. XTryManyUsers (eptr, guess)    /* returns 0 if all done this line */
  597. X    register struct ENTRY *eptr;
  598. X    char *guess;
  599. X{
  600. X    register int retval;
  601. X    char guess_crypted[STRINGSIZE];
  602. X
  603. X    if (eptr -> done && !eptr -> across)
  604. X    {
  605. X    return (0);
  606. X    }
  607. X    strcpy (guess_crypted, crypt (guess, eptr -> passwd.pw_passwd));
  608. X
  609. X    retval = 0;
  610. X
  611. X    while (eptr)
  612. X    {
  613. X#ifdef VERBOSE
  614. X    Log ("Trying '%s' on %s from line %s\n",
  615. X         guess,
  616. X         eptr -> passwd.pw_name,
  617. X         eptr -> filename);
  618. X#endif
  619. X    if (!strcmp (guess_crypted, eptr -> passwd.pw_passwd))
  620. X    {
  621. X        if (!eptr -> done)    /* haven't printed it before */
  622. X        {
  623. X        Log ("Guessed %s (%s in %s) [%s] \n",
  624. X             eptr -> passwd.pw_name,
  625. X             eptr -> passwd.pw_shell,
  626. X             eptr -> filename,
  627. X#ifdef CRACK_PRINT
  628. X             guess
  629. X#else
  630. X             ""
  631. X#endif                /* CRACK_PRINT */
  632. X            );
  633. X        }
  634. X        eptr -> done = 1;
  635. X    }
  636. X    retval += (!eptr -> done);
  637. X    eptr = eptr -> across;
  638. X    }
  639. X
  640. X    return (retval);
  641. X}
  642. X
  643. Xint
  644. XTryOneUser (eptr, guess)    /* returns non-null on guessed user */
  645. X    register struct ENTRY *eptr;
  646. X    register char *guess;
  647. X{
  648. X    if (!guess || !*guess || eptr -> done)
  649. X    {
  650. X    return (0);
  651. X    }
  652. X#ifdef VERBOSE
  653. X    Log ("Trying '%s' on %s from %s\n",
  654. X     guess,
  655. X     eptr -> passwd.pw_name,
  656. X     eptr -> filename);
  657. X#endif
  658. X    if (strcmp (crypt (guess, eptr -> passwd.pw_passwd),
  659. X        eptr -> passwd.pw_passwd))
  660. X    {
  661. X    return (0);
  662. X    }
  663. X    eptr -> done = 1;
  664. X    Log ("Guessed %s (%s in %s) [%s] \n",
  665. X     eptr -> passwd.pw_name,
  666. X     eptr -> passwd.pw_shell,
  667. X     eptr -> filename,
  668. X#ifdef CRACK_PRINT
  669. X     guess
  670. X#else
  671. X     ""
  672. X#endif                /* CRACK_PRINT */
  673. X    );
  674. X
  675. X    return (1);
  676. X}
  677. X/*
  678. X * TOP LEVEL CRACKING FUNCTION INTERFACE ROUTINE - SINGLE USER ONLY
  679. X */
  680. X
  681. Xint
  682. XWordTry (entry_ptr, guess)
  683. X    register struct ENTRY *entry_ptr;
  684. X    register char *guess;
  685. X{
  686. X    int all_lower;
  687. X    int all_upper;
  688. X    register char *ptr;
  689. X    char guess2[STRINGSIZE];
  690. X
  691. X    if (!guess[1])        /* avoid wasting time on initials */
  692. X    {
  693. X    return (0);
  694. X    }
  695. X    if (TryOneUser (entry_ptr, guess) ||
  696. X    TryOneUser (entry_ptr, Reverse (guess)))
  697. X    {
  698. X    return (1);
  699. X    }
  700. X    all_upper = all_lower = 1;
  701. X    ptr = guess;
  702. X
  703. X    for (ptr = guess; *ptr; ptr++)
  704. X    {
  705. X    if (islower (*ptr))
  706. X    {
  707. X        all_upper = 0;
  708. X    } else if (isupper (*ptr))
  709. X    {
  710. X        all_lower = 0;
  711. X    }
  712. X    }
  713. X
  714. X    if (!all_lower)
  715. X    {
  716. X    strcpy (guess2, Lowercase (guess));
  717. X    if (TryOneUser (entry_ptr, guess2) ||
  718. X        TryOneUser (entry_ptr, Reverse (guess2)))
  719. X    {
  720. X        return (1);
  721. X    }
  722. X    }
  723. X    if (!all_upper)
  724. X    {
  725. X    strcpy (guess2, Uppercase (guess));
  726. X    if (TryOneUser (entry_ptr, guess2) ||
  727. X        TryOneUser (entry_ptr, Reverse (guess2)))
  728. X    {
  729. X        return (1);
  730. X    }
  731. X    }
  732. X    return (0);
  733. X}
  734. X/*
  735. X * END OF PASSWORD GUESSING LAYERS
  736. X */
  737. X
  738. Xvoid
  739. XPass1 ()
  740. X{
  741. X    int cracked;
  742. X    struct ENTRY *head;
  743. X    register char *ptr;
  744. X    register char *ptr2;
  745. X    char junk[STRINGSIZE];
  746. X    register struct ENTRY *this;
  747. X
  748. X    Log ("starting pass1 password information\n");
  749. X
  750. X    for (head = root; head; head = head -> next)
  751. X    {
  752. X    for (this = head; this; this = this -> across)
  753. X    {
  754. X#ifdef CRACK_USERNAME
  755. X        /* username */
  756. X        ptr = this -> passwd.pw_name;
  757. X        if (WordTry (this, ptr))
  758. X        {
  759. X        continue;
  760. X        }
  761. X#endif                /* CRACK_USERNAME */
  762. X
  763. X#ifdef CRACK_USERNAME2
  764. X        /* usernameusername */
  765. X        strcpy (junk, ptr);
  766. X        strcat (junk, ptr);
  767. X        if (WordTry (this, junk))
  768. X        {
  769. X        continue;
  770. X        }
  771. X#endif                /* CRACK_USERNAME2 */
  772. X
  773. X#ifdef CRACK_GECOS
  774. X        /* Gecos information field */
  775. X        cracked = 0;
  776. X        ptr = junk;
  777. X        strcpy (junk, this -> passwd.pw_gecos);
  778. X        if (*ptr == '-')    /* never seen this, but... */
  779. X        {
  780. X        ptr++;
  781. X        }
  782. X        if (ptr2 = strchr (ptr, ';'))    /* trim off junk */
  783. X        {
  784. X        *ptr2 = '\0';
  785. X        }
  786. X        if (ptr2 = strchr (ptr, ','))    /* trim off more junk */
  787. X        {
  788. X        *ptr2 = '\0';
  789. X        }
  790. X        for (;;)
  791. X        {
  792. X        if (ptr2 = strchr (ptr, ' '))
  793. X        {
  794. X            *(ptr2++) = '\0';
  795. X        }
  796. X        if (WordTry (this, ptr))
  797. X        {
  798. X            cracked++;
  799. X            break;
  800. X        }
  801. X        if (ptr2)
  802. X        {
  803. X            ptr = ptr2;
  804. X            while (*ptr && isspace (*ptr))
  805. X            {
  806. X            ptr++;
  807. X            }
  808. X        } else
  809. X        {
  810. X            break;
  811. X        }
  812. X        }
  813. X
  814. X        if (cracked)
  815. X        {
  816. X        continue;
  817. X        }
  818. X#endif                /* CRACK_GECOS */
  819. X    }
  820. X    }
  821. X    return;
  822. X}
  823. X
  824. Xvoid
  825. XPass2 (dictfile)
  826. X    char *dictfile;
  827. X{
  828. X    FILE *fp;
  829. X    int dictnum;
  830. X    register int i;
  831. X    char *dict[MAXDICTSIZE];
  832. X    char buffer[STRINGSIZE];
  833. X    register struct ENTRY *head;
  834. X
  835. X    Log ("starting pass2 on dictionary %s\n", dictfile);
  836. X
  837. X    if (!(fp = fopen (dictfile, "r")))
  838. X    {
  839. X    perror (dictfile);
  840. X    return;
  841. X    }
  842. X    for (dictnum = 0;
  843. X     dictnum < MAXDICTSIZE && fgets (buffer, STRINGSIZE, fp);
  844. X     dictnum++)
  845. X    {
  846. X    Trim (buffer);
  847. X    if (!*buffer)
  848. X    {
  849. X        continue;
  850. X    }
  851. X    dict[dictnum] = Clone (buffer);
  852. X    }
  853. X
  854. X    if (dictnum >= MAXDICTSIZE)
  855. X    {
  856. X    Log ("dictionary %s too big, truncated at %d words\n",
  857. X         dictfile, MAXDICTSIZE);
  858. X    }
  859. X    fclose (fp);
  860. X
  861. X    Log ("loaded %d words from %s\n", dictnum, dictfile);
  862. X    for (head = root; head; head = head -> next)
  863. X    {
  864. X    for (i = 0; i < dictnum; i++)
  865. X    {
  866. X        if (!TryManyUsers (head, dict[i]))
  867. X        {
  868. X        break;
  869. X        }
  870. X    }
  871. X    }
  872. X
  873. X    Log ("Freeing memory of %s\n", dictfile);
  874. X    while (dictnum >= 0)
  875. X    {
  876. X    if (dict[dictnum])
  877. X    {
  878. X        free (dict[dictnum]);
  879. X    }
  880. X    dictnum--;
  881. X    }
  882. X}
  883. X
  884. Xint
  885. Xmain (argc, argv)
  886. X    int argc;
  887. X    char *argv[];
  888. X{
  889. X    int i;
  890. X    FILE *fp;
  891. X    char *file;
  892. X    static char die[] = "die";
  893. X
  894. X    if (argc < 2)
  895. X    {
  896. X    fprintf (stderr, "Usage:\t%s dictfile [dictfile ...]\n", argv[0]);
  897. X    exit (1);
  898. X    }
  899. X    if (!(fp = fopen (die, "w")))
  900. X    {
  901. X    perror (die);
  902. X    exit (2);
  903. X    }
  904. X    fprintf (fp, "#!/bin/sh\nkill -9 %d\n", getpid ());
  905. X    fclose (fp);
  906. X    chmod (die, 0700);
  907. X
  908. X#ifdef FCRYPT
  909. X    init_des ();
  910. X#endif
  911. X
  912. X    LoadData ();
  913. X
  914. X    Pass1 ();
  915. X
  916. X    for (i = 1; argv[i]; i++)
  917. X    {
  918. X    Pass2 (argv[i]);
  919. X    }
  920. X
  921. X    Log ("Finished.\n");
  922. X    return (0);
  923. X}
  924. END_OF_FILE
  925. if test 9199 -ne `wc -c <'CRACK/PROGS/crack-pwc.c'`; then
  926.     echo shar: \"'CRACK/PROGS/crack-pwc.c'\" unpacked with wrong size!
  927. fi
  928. # end of 'CRACK/PROGS/crack-pwc.c'
  929. fi
  930. if test -f 'CRACK/PROGS/crack.h' -a "${1}" != "-c" ; then
  931.   echo shar: Will not clobber existing file \"'CRACK/PROGS/crack.h'\"
  932. else
  933. echo shar: Extracting \"'CRACK/PROGS/crack.h'\" \(1733 characters\)
  934. sed "s/^X//" >'CRACK/PROGS/crack.h' <<'END_OF_FILE'
  935. X/* Configurable bits */
  936. X
  937. X/*
  938. X * This program is copyright (c) Alec Muffett 1991 except for certain
  939. X * portions of code ("fdes-crypt.c") copyright (c) Robert Baldwin, Icarus
  940. X * Sparry and Alec Muffett.  The author(s) disclaims all responsibility or
  941. X * liability with respect to it's usage or its effect upon hardware or
  942. X * computer systems.  This software is in the public domain and is freely
  943. X * redisrtibutable PROVIDED that this copyright notice remains intact.
  944. X */
  945. X
  946. X#define CRACK_USERNAME        /* use the username as a guess */
  947. X#define CRACK_USERNAME2        /* use the username (doubled) as a guess */
  948. X#define CRACK_GECOS        /* use elements of gecos field as guesses */
  949. X#define CRACK_PRINT        /* print guessed output to file */
  950. X#undef BRAINDEAD6        /* see fdes.h, if you have it */
  951. X#undef FCRYPT            /* #undef this line if you don't have
  952. X                 * fcrypt(). See "fdes.h" if you do. */
  953. X
  954. X#define BZERO            /* #undef this line if your bzero() is slow
  955. X                 * or non-existent - else DEFINE IT! */
  956. X
  957. X#undef FAST_TOCASE        /* #undef this line if you haven't got macros
  958. X                 * called _tolower() & _toupper() - check
  959. X                 * manuals for toupper(3) */
  960. X
  961. X#undef SHORT_PASSWDS        /* #define this line if you want to check
  962. X                 * dictionary words < 5 chars long */
  963. X
  964. X#define MAXDICTSIZE    32000    /* this value can be tweaked, but if it is
  965. X                 * too small, the program will tell you */
  966. X
  967. X#include <stdio.h>
  968. X#include <ctype.h>
  969. X#include <string.h>
  970. X#include <pwd.h>
  971. X
  972. X/* end of configurable bits */
  973. X
  974. X#define STRINGSIZE    255
  975. X
  976. Xvoid Trim ();
  977. Xchar *Reverse ();
  978. Xchar *Uppercase ();
  979. Xchar *Lowercase ();
  980. Xchar *Clone ();
  981. X
  982. X#ifdef FAST_TOCASE
  983. X#define toupper(x)     _toupper(x)
  984. X#define tolower(x)    _tolower(x)
  985. X#endif
  986. X
  987. X#ifdef FCRYPT
  988. X#define crypt(a,b)    fcrypt(a,b)
  989. X#endif
  990. X
  991. X#define RISC
  992. X
  993. X#undef CISC
  994. END_OF_FILE
  995. if test 1733 -ne `wc -c <'CRACK/PROGS/crack.h'`; then
  996.     echo shar: \"'CRACK/PROGS/crack.h'\" unpacked with wrong size!
  997. fi
  998. # end of 'CRACK/PROGS/crack.h'
  999. fi
  1000. if test -f 'CRACK/PROGS/sh.makedict' -a "${1}" != "-c" ; then
  1001.   echo shar: Will not clobber existing file \"'CRACK/PROGS/sh.makedict'\"
  1002. else
  1003. echo shar: Extracting \"'CRACK/PROGS/sh.makedict'\" \(256 characters\)
  1004. sed "s/^X//" >'CRACK/PROGS/sh.makedict' <<'END_OF_FILE'
  1005. X#!/bin/sh
  1006. X
  1007. Xpp="PROGS/crack-pp"    # I'll fix this elegantly some other time...
  1008. Xdictdir=$1
  1009. X
  1010. Xshift
  1011. X
  1012. Xif [ ! -f $pp ]
  1013. Xthen
  1014. X    echo "$0: No preprocessor $pp"
  1015. X    exit 1
  1016. Xfi
  1017. X
  1018. Xrm $dictdir/dict.*
  1019. X
  1020. X$pp $*
  1021. X
  1022. Xfor i in dict.*
  1023. Xdo
  1024. X    sort $i | uniq > $dictdir/$i
  1025. X    rm $i
  1026. Xdone
  1027. Xexit 0
  1028. END_OF_FILE
  1029. if test 256 -ne `wc -c <'CRACK/PROGS/sh.makedict'`; then
  1030.     echo shar: \"'CRACK/PROGS/sh.makedict'\" unpacked with wrong size!
  1031. fi
  1032. chmod +x 'CRACK/PROGS/sh.makedict'
  1033. # end of 'CRACK/PROGS/sh.makedict'
  1034. fi
  1035. if test -f 'CRACK/README' -a "${1}" != "-c" ; then
  1036.   echo shar: Will not clobber existing file \"'CRACK/README'\"
  1037. else
  1038. echo shar: Extracting \"'CRACK/README'\" \(6264 characters\)
  1039. sed "s/^X//" >'CRACK/README' <<'END_OF_FILE'
  1040. X**************************************************************************
  1041. X        CRACK: A Unix password cracking program.
  1042. X**************************************************************************
  1043. X
  1044. XThis is the sort of program I dreamt about whilst I was hacking big Unix
  1045. Xsites a few years ago.  It takes a series of passwd format files, sorts
  1046. Xthem by their encryption salt, and gradually hacks through them finding
  1047. Xpasswords as it goes.
  1048. X
  1049. XUsage:
  1050. X        Crack /etc/passwd [ other passwd format files... ]
  1051. X
  1052. XHopefully, if I've set it up correctly, it will work out what files it
  1053. Xneeds, where they are, what needs to be made, etc...  it should do it
  1054. Xall for you.  If not, play around with the source, starting with the
  1055. Xdefines at the top of "crack.h" in the directory "PROGS".
  1056. X
  1057. XNB: The public version of this program does absolutely nothing "clever"
  1058. Xat all, other than to attack passwords in sensible order.  This is why I
  1059. Xfeel I can post it to the net without fear of recrimination.  If you
  1060. Xthink that I am a moron and that the program is in itself dangerous, I
  1061. Xsuggest that you carefully consider the fact that any 'moron' could have
  1062. Xwritten this program.
  1063. X
  1064. X*** Operating System Specific Notes ***
  1065. X
  1066. XThe program you are using will be have been tested on:-
  1067. X
  1068. X                Ultrix 4.1
  1069. X                SunOS 4.0
  1070. X
  1071. XIf there are any amendments that you have to make to get it going on
  1072. Xyour system, please let me know about them so that I can work it into
  1073. Xthe next release.  I'm afraid I'm a bit restricted in what machines I
  1074. Xcan test it on.  Have a look in "PROGS/crack.h" if it doesn't work.
  1075. X
  1076. XNote to SunOS users:-
  1077. X
  1078. X*IF* "crack-pwc" coredumps with a bus-error, do a "make spotless", and
  1079. Xadd the "-Bstatic" switch to CFLAGS in "PROGS/Makefile".  Something
  1080. Xmakes etext() crash sporadically when accessing the dynamically linked
  1081. Xversion of malloc().  Static linking fixes this.
  1082. X
  1083. X*** Philosophy & Caveats ***
  1084. X
  1085. X"Crack" makes two passes over its source data:- the first based upon
  1086. Xwhat it can make of the users' passwd entry, and the second throws
  1087. Xordered dictionaries at the passwords.  The first pass is usually very
  1088. Xfruitful, and gets lots of results quickly.
  1089. X
  1090. XIn the first pass, passwords are tried in plaintext, forced lowercase
  1091. Xand forced uppercase, forward and reversed (total of six permutations).
  1092. XIt can check 2500 password entries in about 20 minutes using the
  1093. Xstandard crypt() on a DecStation 5000/200.  This is so little overhead
  1094. Xthat the forward/reverse/recasing switches that some of you are used to
  1095. X(eg: from the COPS password checker) have been removed, but see also
  1096. Xbelow.
  1097. X
  1098. XFor pass 2, "Crack" assumes you have a "/usr/dict/words".  If not, edit
  1099. Xthe "Makefile" to have the pathname of a suitable dictionary, or add
  1100. Xextra dictionaries to the list.  "Crack" takes multiple dictionaries,
  1101. Xsorts and uniq's them, and then preprocesses them into different files.
  1102. XIt then throws each file (one by one) at your password selection.  This
  1103. Xmethod removes a lot of runtime overhead.
  1104. X
  1105. XThe preprocessed files (put into the directory "DICTS") are arranged and
  1106. Xprocessed in numerical order of formats most likely to be a guessable
  1107. Xpassword:-
  1108. X
  1109. X    dict.0        forced lowercase words, forwards
  1110. X    dict.1        plaintext (but lowercase) words, pluralised
  1111. X    dict.2        plaintext mixedcase words, forwards
  1112. X    dict.3        forced uppercase words, forwards
  1113. X    dict.4        forced lowercase words, backwards
  1114. X    dict.5        forced uppercase words, backwards
  1115. X    dict.6        plaintext mixedcase words, backwards
  1116. X
  1117. XProcessing them in this order increases the chance of getting a users'
  1118. Xpassword quickly.
  1119. X
  1120. XSince each preprocessed file represents a different format of password
  1121. Xguess, all you need do to stop yourself from doing a certain pass is to
  1122. Xremove the unwanted file.  This is rarely a sensible thing to do, since
  1123. Xusually what you are trying to do is to speed things up, but since
  1124. X"Crack" does things in a sensible order anyway, it's hardly worth
  1125. Xtweaking the dictionaries other than to add new words.
  1126. X
  1127. XLet me repeat the caveat that was attached to the ancient pwchkr.c:-
  1128. XThis program burns a lot of CPU! An awful lot! So if your system runs
  1129. Xlike a snail, don't come screaming to me.  I've half a mind to put
  1130. X"nice(19);" as the first statement in main().
  1131. X
  1132. X*** Fcrypt() usage ***
  1133. X
  1134. X"Crack" can utilise fcrypt() written in 1986 by Robert Baldwin @MIT,
  1135. Xwhich is a pretty darn good version of the crypt() subroutine.  I
  1136. Xreceived a copy of "fdes-xform.c" which was variously hacked about for
  1137. Xportability by Icarus Sparry at Bath.  Fcrypt() used to do 390-ish
  1138. Xencryptions per second.
  1139. X
  1140. XI rewrote most of the tables and the KeySchedule generating algorithm in
  1141. X"fdes-init.c" to knock 40% off the execution overhead of fcrypt() in the
  1142. Xform that it was shipped to me.  I then inlined a bunch of stuff, put it
  1143. Xinto a single file, got some advice from Matt Bishop [thanks Matt] about
  1144. Xwhat to do to xform(), and tidied up some algorithms.
  1145. X
  1146. XOn a DecStation 5000/200, fcrypt() will now do 575-ish transforms per
  1147. Xsecond <grin!>.  Do a "make tests" to find out what your system is like.
  1148. X
  1149. XNOTE: fcrypt() is *NOT* distributed as standard with this package.
  1150. X
  1151. X*** Signature ***
  1152. X
  1153. XSuggestions for improvements to me please, and I'll keep the updates
  1154. Xcoming...  I already know about the clearing/copying data subroutines.
  1155. X
  1156. XIf you're feeling gung-ho, play with the highly optimised:-
  1157. X
  1158. X              make alotfaster
  1159. X
  1160. X...option.  It seems to work OK on Ultrix 4.1.
  1161. X
  1162. X                    Alec Muffett>>>++>>, July 15 1991
  1163. X--
  1164. Xp.s.    I've pinched the internet worm password file from COPS, hacked it
  1165. X    about a bit, and supplied it here as "bad_pws.dat".  It is wired
  1166. X    into the Makefile as an additional dictionary - AEM
  1167. X--
  1168. XINET: aem@aber.ac.uk      JANET: aem@uk.ac.aber      BITNET: aem%aber@ukacrl
  1169. XUUCP: ...!mcsun!ukc!aber!aem         ARPA: aem%uk.ac.aber@nsfnet-relay.ac.uk
  1170. XSNAIL: Alec Muffett, Computer Unit, Llandinam UCW, Aberystwyth, UK, SY23 3DB
  1171. X
  1172. X*** stddisclaimer.h ***
  1173. X
  1174. X/*
  1175. X * This program is copyright (c) Alec Muffett 1991 except for certain
  1176. X * portions of code ("fdes-crypt.c") copyright (c) Robert Baldwin, Icarus
  1177. X * Sparry and Alec Muffett.  The author(s) disclaims all responsibility or
  1178. X * liability with respect to it's usage or its effect upon hardware or
  1179. X * computer systems.  This software is in the public domain and is freely
  1180. X * redisrtibutable PROVIDED that this copyright notice remains intact.
  1181. X */
  1182. END_OF_FILE
  1183. if test 6264 -ne `wc -c <'CRACK/README'`; then
  1184.     echo shar: \"'CRACK/README'\" unpacked with wrong size!
  1185. fi
  1186. # end of 'CRACK/README'
  1187. fi
  1188. if test -f 'CRACK/bad_pws.dat' -a "${1}" != "-c" ; then
  1189.   echo shar: Will not clobber existing file \"'CRACK/bad_pws.dat'\"
  1190. else
  1191. echo shar: Extracting \"'CRACK/bad_pws.dat'\" \(3105 characters\)
  1192. sed "s/^X//" >'CRACK/bad_pws.dat' <<'END_OF_FILE'
  1193. X123456
  1194. X12345678
  1195. XAnduin
  1196. XDoobrie
  1197. XLouise
  1198. XMortis
  1199. XSnarfel
  1200. Xacademia
  1201. Xaerobics
  1202. Xairplane
  1203. Xalbany
  1204. Xalbatross
  1205. XAlbert
  1206. XAlexander
  1207. Xalgebra
  1208. Xaliases
  1209. Xalphabet
  1210. Xamorphous
  1211. Xanalog
  1212. Xanchor
  1213. Xandromache
  1214. Xanimals
  1215. Xanswer
  1216. Xanthropogenic
  1217. Xanvils
  1218. Xanything
  1219. Xariadne
  1220. XArthur
  1221. Xasdfgh
  1222. Xathena
  1223. Xatmosphere
  1224. Xaztecs
  1225. Xbacchus
  1226. Xbailey
  1227. Xbanana
  1228. Xbananas
  1229. Xbandit
  1230. Xbarber
  1231. Xbaritone
  1232. Xbassoon
  1233. Xbatman
  1234. Xbeater
  1235. Xbeauty
  1236. Xbeethoven
  1237. Xbeetledrive
  1238. Xbeloved
  1239. Xbeowulf
  1240. Xberkeley
  1241. Xberliner
  1242. XBeverly
  1243. Xbicameral
  1244. XBrenda
  1245. XBridget
  1246. Xbroadway
  1247. Xbumbling
  1248. Xburgess
  1249. Xcampanile
  1250. Xcantor
  1251. Xcardinal
  1252. Xcarmen
  1253. Xcarolina
  1254. XCaroline
  1255. Xcascades
  1256. Xcastle
  1257. Xcayuga
  1258. Xceltics
  1259. Xcerulean
  1260. Xchange
  1261. XCharles
  1262. Xcharming
  1263. Xcharon
  1264. Xcheesecake
  1265. Xchester
  1266. Xcinelli
  1267. Xclassic
  1268. Xclusters
  1269. Xcoffee
  1270. Xcollins
  1271. Xcommrades
  1272. Xcomputer
  1273. Xcookie
  1274. Xcooper
  1275. XCornelius
  1276. Xcouscous
  1277. Xcreation
  1278. Xcreosote
  1279. Xcretin
  1280. Xdaemon
  1281. Xdancer
  1282. XDaniel
  1283. Xdecember
  1284. Xdeluge
  1285. Xdesperate
  1286. Xdevelop
  1287. Xdieter
  1288. Xdigital
  1289. Xdiscbox
  1290. Xdiscovery
  1291. Xdisney
  1292. Xdrought
  1293. XDuncan
  1294. Xeasier
  1295. Xedinburgh
  1296. XEdwina
  1297. Xegghead
  1298. Xeiderdown
  1299. XEileen
  1300. XEinstein
  1301. Xelephant
  1302. XElizabeth
  1303. Xemerald
  1304. Xengine
  1305. Xengineer
  1306. Xenterprise
  1307. Xenzyme
  1308. Xersatz
  1309. Xestablish
  1310. Xestate
  1311. Xeuclid
  1312. Xeugene
  1313. XEvelyn
  1314. Xextension
  1315. Xfairway
  1316. Xfelicia
  1317. Xfender
  1318. Xfermat
  1319. Xfidelity
  1320. Xfinite
  1321. Xfishers
  1322. Xflakes
  1323. Xflower
  1324. Xflowers
  1325. Xfoolproof
  1326. Xfootball
  1327. Xforesight
  1328. Xformat
  1329. Xforsythe
  1330. Xfourier
  1331. Xfriend
  1332. Xfrighten
  1333. Xfungible
  1334. XGabriel
  1335. Xgardner
  1336. Xgarfield
  1337. XGeorge
  1338. Xgertrude
  1339. XGilly
  1340. XGinger
  1341. Xglacier
  1342. Xgolfer
  1343. Xgorgeous
  1344. Xgorges
  1345. Xgosling
  1346. Xgraham
  1347. Xgrass
  1348. Xgryphon
  1349. Xguitar
  1350. Xgumption
  1351. Xguntis
  1352. Xgweledigaeth
  1353. Xhacker
  1354. Xhamlet
  1355. Xhandily
  1356. Xhappening
  1357. Xharmony
  1358. Xharold
  1359. Xharvey
  1360. Xhebrides
  1361. Xheinlein
  1362. Xherbert
  1363. Xhiawatha
  1364. Xhibernia
  1365. Xhobbit
  1366. Xhutchins
  1367. Xiluvben
  1368. Ximbroglio
  1369. Ximperial
  1370. Xinclude
  1371. Xingres
  1372. Xinnocuous
  1373. Xirishman
  1374. XJessica
  1375. Xjester
  1376. Xjixian
  1377. XJohnny
  1378. XJoseph
  1379. XJoshua
  1380. Xjudith
  1381. Xjuggle
  1382. Xkalajira
  1383. XKathleen
  1384. Xkermit
  1385. Xkernel
  1386. Xkipper
  1387. Xkirkland
  1388. Xknight
  1389. Xlager
  1390. Xlambda
  1391. Xlamination
  1392. Xlarkin
  1393. Xlazarus
  1394. Xlebesgue
  1395. Xleland
  1396. Xmacintosh
  1397. Xmaggot
  1398. XMalcolm
  1399. Xmarkus
  1400. Xmarvin
  1401. Xmaster
  1402. XMaurice
  1403. Xmellon
  1404. Xmerlin
  1405. XMichael
  1406. XMichelle
  1407. Xminimum
  1408. Xminsky
  1409. Xmoguls
  1410. Xmorley
  1411. Xmortis
  1412. Xmozart
  1413. Xmuser
  1414. Xnapoleon
  1415. Xnepenthe
  1416. Xnetwork
  1417. Xnewton
  1418. Xnoxious
  1419. Xnutrition
  1420. Xnyquist
  1421. Xoceanography
  1422. Xocelot
  1423. Xoerhrdle
  1424. Xolivetti
  1425. XOlivia
  1426. Xoracle
  1427. Xorchid
  1428. Xorwell
  1429. Xosiris
  1430. Xoutlaw
  1431. Xoxford
  1432. Xpacific
  1433. Xpainless
  1434. Xpakistan
  1435. Xpapers
  1436. Xpassword
  1437. XPatricia
  1438. Xpenguin
  1439. Xpeoria
  1440. Xpercolate
  1441. Xpersimmon
  1442. Xpersona
  1443. Xphilip
  1444. Xphoenix
  1445. XPierre
  1446. Xplover
  1447. Xplymouth
  1448. Xpolynomial
  1449. Xpondering
  1450. Xposter
  1451. Xpraise
  1452. Xprecious
  1453. Xprelude
  1454. Xprince
  1455. Xprinceton
  1456. Xprotect
  1457. Xprotozoa
  1458. Xpumpkin
  1459. Xpuneet
  1460. Xpuppet
  1461. Xqwerty
  1462. Xqwertyui
  1463. Xrabbit
  1464. Xrachmaninoff
  1465. Xrainbow
  1466. Xraindrop
  1467. Xraleigh
  1468. Xrandom
  1469. Xrascal
  1470. Xreally
  1471. XRebecca
  1472. Xremote
  1473. Xripple
  1474. Xrobotics
  1475. Xrochester
  1476. Xromano
  1477. XRonald
  1478. XRonnie
  1479. Xrosebud
  1480. XRosemary
  1481. Xsaturn
  1482. Xscamper
  1483. Xscheme
  1484. Xscotty
  1485. Xsecret
  1486. Xsensor
  1487. Xserenity
  1488. Xsharks
  1489. Xsharon
  1490. Xsheffield
  1491. Xsheldon
  1492. Xshitforbrains
  1493. Xshivers
  1494. Xshuttle
  1495. Xsignature
  1496. Xsilverlake
  1497. Xsimple
  1498. Xsinger
  1499. Xsingle
  1500. Xsmiles
  1501. Xsmooch
  1502. Xsmother
  1503. Xsnatch
  1504. Xsnoopy
  1505. Xsocrates
  1506. Xsossina
  1507. Xsparrows
  1508. Xsplatter
  1509. Xsplodge
  1510. Xspring
  1511. Xspringer
  1512. Xsquires
  1513. Xstrangle
  1514. Xstratford
  1515. Xstuttgart
  1516. Xsubway
  1517. Xsuccess
  1518. Xsucker
  1519. Xsummer
  1520. Xsuperstage
  1521. Xsupport
  1522. Xsupported
  1523. Xsurfer
  1524. XSuzanne
  1525. Xswearer
  1526. Xsymmetry
  1527. Xtangerine
  1528. Xtarget
  1529. Xtarragon
  1530. Xtaylor
  1531. Xteabag
  1532. Xtelephone
  1533. Xtemptation
  1534. Xthailand
  1535. Xthanatos
  1536. Xtoggle
  1537. Xtomato
  1538. Xtopography
  1539. Xtortoise
  1540. Xtoyota
  1541. Xtrails
  1542. Xtrivial
  1543. Xtrombone
  1544. Xtuttle
  1545. Xunhappy
  1546. Xunicorn
  1547. Xunknown
  1548. Xurchin
  1549. Xutility
  1550. Xvasant
  1551. Xvertigo
  1552. Xvillage
  1553. XVirginia
  1554. Xvortex
  1555. XWarren
  1556. Xweenie
  1557. Xwhatnot
  1558. Xwhiting
  1559. Xwhitney
  1560. XWilliam
  1561. Xwilliamsburg
  1562. XWillie
  1563. Xwinston
  1564. Xwisconsin
  1565. Xwizard
  1566. Xwombat
  1567. Xwoodwind
  1568. Xwormwood
  1569. Xxerox
  1570. Xyellowstone
  1571. Xyosemite
  1572. Xzerox
  1573. Xzimmerman
  1574. Xzxcvbn
  1575. END_OF_FILE
  1576. if test 3105 -ne `wc -c <'CRACK/bad_pws.dat'`; then
  1577.     echo shar: \"'CRACK/bad_pws.dat'\" unpacked with wrong size!
  1578. fi
  1579. # end of 'CRACK/bad_pws.dat'
  1580. fi
  1581. echo shar: End of archive 1 \(of 1\).
  1582. cp /dev/null ark1isdone
  1583. MISSING=""
  1584. for I in 1 ; do
  1585.     if test ! -f ark${I}isdone ; then
  1586.     MISSING="${MISSING} ${I}"
  1587.     fi
  1588. done
  1589. if test "${MISSING}" = "" ; then
  1590.     echo You have the archive.
  1591.     rm -f ark[1-9]isdone
  1592. else
  1593.     echo You still need to unpack the following archives:
  1594.     echo "        " ${MISSING}
  1595. fi
  1596. ##  End of shell archive.
  1597. exit 0
  1598.  
  1599.  
  1600.